package com.sxj.corejava.code13_jdbc;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;

/**
 * @author 石小俊
 */
public class Test06_保存返回主键 {

    public static void main(String[] args) {
        User user = new User("李四", "123456", "13612366689", "浙江-金华");
        System.out.println("保存前:" + user);
        Integer id = insertReturnPrimaryKey(user);
        System.out.println("返回的主键值:" + id);
        user.setId(id);
        System.out.println("保存后:" + user);
    }


    public static Integer insertReturnPrimaryKey(User user) {
        Connection conn = null;
        PreparedStatement ps = null;
        ResultSet rs = null;
        Integer id = null;
        try {
            conn = JDBCUtil.getConnection();
            String sql = new StringBuffer()
                    .append(" insert into ")
                    .append(" t_user(username,password,phone,address)")
                    .append(" values(?,?,?,?)")
                    .toString();
            // 想要实现保存返回主键,在获取状态集的时候,需要设置状态集为保存返回主键的
            // 通过第二个参数控制保存后是否返回主键,其值有两种,都是由Statement提供的属性
            // RETURN_GENERATED_KEYS:保存后返回自动生成的键的值
            // NO_GENERATED_KEYS:保存后不返回自动生成的键的值
            // 通过子类PreparedStatement也可以直接访问父类属性
            ps = conn.prepareStatement(sql, PreparedStatement.RETURN_GENERATED_KEYS);
            ps.setString(1, user.getUsername());
            ps.setString(2, user.getPassword());
            ps.setString(3, user.getPhone());
            ps.setString(4, user.getAddress());
            // 执行DML
            ps.executeUpdate();
            // 此时数据库中已经保存了数据,因此主键的值一定已经生成了
            // 可以通过Statement提供的getGeneratedKeys方法获取由于执行此 Statement 对象而创建的所有自动生成的键
            // 即:在此处表示获取自动生成的主键的值
            rs = ps.getGeneratedKeys();
            while (rs.next()) {
                // 由于自动生成的主键字段使用的列名不是当前表中主键字段名
                // 而是由数据库厂商定义的字段名
                // 但是,在此处我们可以确定有其仅有一个字段
                // 因此,可以直接获取第一列的值
                // GENERATED_KEY
                id = rs.getInt(1);
            }
            return id;
        } catch (SQLException e) {
            e.printStackTrace();
            throw new DataAccessException("数据访问异常");
        }
    }

}
